#include <iostream>
#include <vector>
#include <chrono>

// 替换为你的阻塞队列头文件和命名空间
#include "concurrent_queue.hpp"

using namespace std;

// 定义一个简单的数据类型
struct TestData {
    int value;

    TestData(int v = 0) : value(v) {}
};

int main() {
    // 定义一个阻塞队列，这里使用 TestData 作为元素类型
    ConcurrentQueue<TestData> myQueue;

    // 定义生产者函数
    auto producerFunc = [&](int id) {
        for (int i = 0; i < 10; ++i) {
            TestData data(id * 10 + i);
            myQueue.push(move(data));
            cout << "\033[31m";  // 1; 表示加粗
            cout << "Producer " << id << " 生产: " << id * 10 + i << endl;
            cout << "\033[0m";
            this_thread::sleep_for(chrono::milliseconds(50));
        }
    };

    // 定义消费者函数
    auto consumerFunc = [&](int id) {
        for (int i = 0; i < 2; ++i) {
            TestData data;
            myQueue.pop(data);
            cout << "Consumer " << id << " 消费: " << data.value << endl;
            this_thread::sleep_for(chrono::milliseconds(100));
        }
    };

    // 启动 2 个生产者线程
    vector<thread> producers;
    for (int i = 0; i < 2; ++i) {
        producers.emplace_back(producerFunc, i);
    }

    this_thread::sleep_for(chrono::milliseconds(200));
    // 启动1个消费者线程
    vector<thread> consumers;
    for (int i = 0; i < 1; ++i) {
        consumers.emplace_back(consumerFunc, i);
    }

    // 等待所有生产者线程完成
    for (auto& producer : producers) {
        producer.join();
    }

    // 等待所有消费者线程完成
    for (auto& consumer : consumers) {
        consumer.join();
    }

    return 0;
}
